package com.xbongbong.paas.enums.bi;

import com.xbongbong.i18n.util.I18nMessageUtil;
import lombok.Getter;

import java.util.Arrays;
import java.util.Objects;

/**
 * 数据集节点类型枚举
 * @author 梁鲁江
 */
@Getter
public enum DataSetNodeTypeEnum {
    /**
     * 数据源节点
     *
     * 总数量：1-10
     * 流入：0
     * 流出：1
     */
    INPUT(1, "input", "enum.dataSetNodeType.name.input", 1, 10, 0, 0, 1),
    /**
     * 合并节点
     *
     * 总数量：0-10
     * 流入：2-10
     * 流出：1
     */
    UNION(2, "union", "enum.dataSetNodeType.name.union", 0, 10, 2, 10, 1),
    /**
     * 连接节点
     *
     * 总数量：0-10
     * 流入：2
     * 流出：1
     */
    JOIN(3, "join", "enum.dataSetNodeType.name.join", 0, 10, 2, 2, 1),
    /**
     * 分组汇总节点
     *
     * 总数量：0-10
     * 流入：1
     * 流出：1
     */
    GROUP(4, "group", "enum.dataSetNodeType.name.group", 0, 10, 1, 1, 1),
    /**
     * 输出节点
     *
     * 总数量：1
     * 流入：1
     * 流出：0
     */
    OUTPUT(5, "output", "enum.dataSetNodeType.name.output", 1, 1, 1, 1, 0),
    ;
    private int code;
    private String alias;
    private String name;
    /**
     * 该类节点最少数量
     */
    private int minCount;
    /**
     * 该类节点最多数量
     */
    private int maxCount;
    /**
     * 该类节点流入线条最少数量 - 只有合并节点是范围，其他固定数量
     */
    private int flowInMin;
    /**
     * 该类节点流入线条最多数量 - 只有合并节点是范围，其他固定数量
     */
    private int flowInMax;
    /**
     * 该类节点流出线条数量
     */
    private int flowOutCount;

    DataSetNodeTypeEnum(int code, String alias, String name, int minCount, int maxCount, int flowInMin, int flowInMax, int flowOutCount) {
        this.code = code;
        this.alias = alias;
        this.name = name;
        this.minCount = minCount;
        this.maxCount = maxCount;
        this.flowInMin = flowInMin;
        this.flowInMax = flowInMax;
        this.flowOutCount = flowOutCount;
    }

    /**
     * 根据alias获取枚举
     * @param alias
     * @return
     */
    public static DataSetNodeTypeEnum getByAlias(String alias){
        return Arrays.stream(values()).filter(nodeTypeEnum -> Objects.equals(nodeTypeEnum.getAlias(), alias)).findAny().orElse(null);
    }

    public String getName() {
        return I18nMessageUtil.getMessage(name);
    }
}
